package modelo;

public class Policia {

	private String nombre;
	private int arrestosRealizados = 0;
	private Rango rango;
	private Ciudad ciudadActual=null;
	private float tiempoRestante;
	private Ladron ladronConOrdenArresto;
	private Pista ultimaPista;
	private Sospechoso rasgosDelSospechoso;
	private OrdenDeArresto miOrdenDeArresto;
	
	public int getArrestosRealizados() {
		return arrestosRealizados;
	}
	
	public int getVelocidad() {
		return rango.getVelocidad();
	}
	
	public Rango getRango() {
		return rango;
	}
	
	public Ciudad getCiudadActual() {
		return this.ciudadActual;
	}
	
	public void setCiudadActual(Ciudad ciudad) {
		this.ciudadActual = ciudad;
	}
	
	public Policia(){
		reiniciarParaProximoCaso();
		this.rango = new Novato();
	}
	
	public Policia(Ciudad ciudad){
		reiniciarParaProximoCaso();
		this.rango = new Novato();
		
		this.ciudadActual = ciudad;
		this.miOrdenDeArresto = null;
	}

	public void reiniciarParaProximoCaso() {
		tiempoRestante = 5*24;
		this.rasgosDelSospechoso=new Sospechoso();
		ultimaPista = null;
		miOrdenDeArresto = null;
	}
	
	public void sumarArresto(){
		arrestosRealizados++;
		if (rango.consiguioAscenso(arrestosRealizados)){
			rango = rango.getProximoRango();
		}
	}
	
	public void viajarACiudad(Ciudad unaCiudad) {
		
		float distancia = unaCiudad.getCoordenada().obtenerDistanciaA(this.ciudadActual.getCoordenada())*100;
		float tiempo = distancia/this.rango.getVelocidad();
		
 		if ( this.consumirTiempo(tiempo) ){
			this.ciudadActual = unaCiudad;
		}
	}

	public boolean consumirTiempo(float cantidad)	{
		
		Juego juego = Juego.getInstancia();
		
		tiempoRestante -= cantidad;
		
		if (tiempoRestante <= 0){
			tiempoRestante = 0;
			juego.terminar(false);
			return false;
		}
		return true;
	}

	public void visitar(Edificio unEdificio) {
		
		//Solo puede visitar edificios en la misma ciudad
		if(ciudadActual.getEdificios().contains(unEdificio)){			
			
			atraparLadron(unEdificio);
			
			boolean consumir = !unEdificio.haSidoVisitado();
			
			this.setUltimaPista(rango.obtenerPistaDe(unEdificio));
					
			if(consumir){
				this.consumirTiempo(ciudadActual.getCantidadEdificiosVisitados());
			}
			
		}
	}

	public float getTiempoRestante() {
		
		return this.tiempoRestante;
	}

	public Ladron getLadronConOrdenArresto() {
		return ladronConOrdenArresto;
	}

	public void atraparLadron(Edificio edificioActual) {

		Juego juego = Juego.getInstancia();
		Ladron ladron = juego.getLadron();
		
		if(ladron.getEdificio() == edificioActual){
			//Si estoy en el mismo edificio y no tengo la orden de arresto correcta pierdo
			if( !juego.haTerminado() ){
				boolean loAtrape = false;
				if (miOrdenDeArresto != null){
					loAtrape = miOrdenDeArresto.esPara(ladron);
				}
				juego.terminar(loAtrape);
	
				if(juego.haGanado())
					this.sumarArresto();
			}
		}
	}

	public void guardarRasgo(Rasgos.Cabello cabello) {
		this.rasgosDelSospechoso.setCabello(cabello);
	}
	
	public void guardarRasgo(Rasgos.Sexo sexo) {
		this.rasgosDelSospechoso.setSexo(sexo);
	}
	
	public void guardarRasgo(Rasgos.Senia senia) {
		this.rasgosDelSospechoso.setSenia(senia);
	}
	
	public void guardarRasgo(Rasgos.Vehiculo vehiculo) {
		this.rasgosDelSospechoso.setVehiculo(vehiculo);
	}
		
	public void guardarRasgo(Rasgos.Hobby hobby) {
		this.rasgosDelSospechoso.setHobby(hobby);
	}
	
	public Sospechoso getSospechoso() {
		return this.rasgosDelSospechoso;
	}

	public Pista getUltimaPista() {
		return ultimaPista;
	}

	public void setUltimaPista(Pista ultimaPista) {
		this.ultimaPista = ultimaPista;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public OrdenDeArresto getOrdenDeArresto() {
		return this.miOrdenDeArresto;
	}

	public void setOrdenArresto(OrdenDeArresto ordenDeArresto) {
		this.miOrdenDeArresto = ordenDeArresto;
	}
	
}
